#ifndef OTDRDIALOG_H
#define OTDRDIALOG_H

#include <QDialog>
#include <drawminidlg.h>
#include <displayresultdlg.h>
#include <QPainter>

namespace Ui {
class OtdrDialog;
}

class OtdrDialog : public QDialog
{
    Q_OBJECT

public:
    explicit OtdrDialog(QWidget *parent = 0);
    ~OtdrDialog();
    unsigned short StartMode;  /*开机自启动模块，０表示ＯＴＤＲ模块*/
    bool ReadFile(QString FileName);  /*读取文件*/
    bool SaveFile(short style);  /*保存文件 style:文件类型 0:EI 1:SOR 2:临时数据*/
    void SetDataHead(short index);  /*设置数据头的内容*/
    void SetDataPartHead(short index);  /*设置数据头的部分内容,如量程，四条曲线需统一*/
    void SetSorDataHead(short index);  /*以默认参数初始化SOR的数据格式*/
    int AutoSaveNum;
    quint32 Data_Num;  /*用于保存在文件中读取的曲线数据的大小*/
    quint32 PreData_Num;  /*用于保存在文件中预览的曲线数据的大小*/
    int CursorPos;  /*激活光标对应像素位置*/
    int ZoomYScale[8];  /*垂直放大尺度*/
    int ZoomYScaleIndex;/*垂直放大尺度序号*/
    int ZoomYScaleIndexOld;/*垂直放大尺度序号*/
    unsigned short TraceValueStartOld;   /*进行曲线绘制的纵轴起点  纵轴范围0~45000*/
    unsigned short TraceValueStart;   /*进行曲线绘制的纵轴起点  纵轴范围0~45000*/
    int CursorPosA;  /*光标A对应像素位置*/
    int CursorPosa;  /*光标a对应像素位置*/
    qint32 CursorPosAPoint;  /*光标A对应曲线数据中的点数*/
    qint32 CursorPosaPoint;  /*光标a对应曲线数据中的点数*/
    int CursorPosB;  /*光标B对应像素位置*/
    int CursorPosb;  /*光标b对应像素位置*/
    qint32 CursorPosBPoint;  /*光标B对应曲线数据中的点数*/
    qint32 CursorPosbPoint;  /*光标b对应曲线数据中的点数*/
    qint32 LockABPoint; /*光标锁定时，AB之间间隔点数*/
    qint32 LockaAPoint; /*光标锁定时，aA之间间隔点数*/
    qint32 LockBbPoint; /*光标锁定时，Bb之间间隔点数*/
    int CursorFlag; /*光标激活标记 0:光标A激活 1:光标B激活 2:光标a激活 3:光标b激活*/
    float K_LSA;
    float B_LSA;
    int EveX[200];  /*EveX:表示事件点在屏幕X轴上的位置; */
    int EveY[200]; /*EveY:表示事件点在屏幕Y轴上的位置*/
    int TouchNum; /*触控点数*/
    int TouchUpdateNum; /*触控更新阶段点数*/
    QPointF TouchPointS[2]; /*两个起始触控点位置*/
    QPointF TouchPointE[2]; /*两个终止触控点位置*/
    int ListFlag;  /*下拉列表显示标记 0:侧边栏隐藏 1:侧边栏显示*/
    DrawMiniDlg *DrawMiniDialog; /*概要曲线窗口指针*/
    DisplayResultDlg *ResultDlg; /*测试结果窗口指针*/
    QPainter OTDRPainter;
    int DrawPointNum;  /*绘图点数,初始状态对应曲线绘制宽度*/
    int CursorPosDelt;  /*光标步进,初始状态为1*/
    void XZoomIn();
    void XZoomOut();
    void YZoomIn();
    void YZoomOut();
    void CursorChange(); /*光标切换函数*/
    void SetCodeFromFile(short style); /*根据读取的文件中保存的测试条件设置波长、脉宽等测试参数值*/
    void FileTraceInit(quint32 num); /*文件获取曲线初始化*/
    void DrawGrid(QPixmap *pix); /*绘制网格*/
    void DrawCoordinate(QPainter *painter); /*绘制坐标轴*/
    void DrawCursorA(QPainter *painter); /*绘制光标A*/
    void DrawCursorB(QPainter *painter); /*绘制光标B*/
    void DrawCursora(QPainter *painter); /*绘制光标a*/
    void DrawCursorb(QPainter *painter); /*绘制光标b*/
    void DrawTrace(QPainter *painter); /*绘制曲线*/
    void DrawResult(QPainter *painter); /*绘制光标A、B位置及光标间损耗*/
    void CalculateResult(); /*计算损耗*/
    void Loss_LSA(quint32 X1, quint32 X2); /*LSA法计算平均损耗*/
    void Loss_Return(quint32 X1, quint32 X2); /*计算反射损耗*/
    void ZoomPic(short x); /*显示隐藏放大图标*/
    float Eve_Dis();
    void DrawEvent(QPainter *painter); /*绘制事件点*/
    void DispEventLocation();
    void RowMoveCursor();
    void SetDlgEnabled(bool ableflag);
    void InitTrace();/*曲线初始化*/
    void SetCursorPos();/*设置光标位置  保证光标顺序为a、A、B、b*/
    void CalCursorPos();/*计算光标位置*/
    void CalXStartValue();/*计算横轴起始点*/
    void CalYStartValue();/*计算纵轴起始点*/
    void GetDisplayData();/*获取显示用数据，数据点数与显示区域分辨率对应*//*水平放大尺度0-10,小于9时，曲线上一个像素对应一个数据点*/
    void InitXZoom();/*初始化水平方向放大*/
    void WriteOtdrCfgFile();
    void ReadOtdrCfgFile();
    void PreFile(QString FileName);/*预览文件,显示曲线*/
    int MouseMoveFlag;  /*鼠标拖动操作标记 0:鼠标拖动操作完毕;1:鼠标拖动操作中*/
    int MousePosOld;  /*鼠标拖动状态鼠标位置X*/
    int MousePosStart;  /*鼠标拖动状态起始鼠标位置X*/
    int MousePos;  /*鼠标拖动状态鼠标位置X*/
    int MousePosOldY;  /*鼠标拖动状态鼠标位置Y*/
    int MousePosStartY;  /*鼠标拖动状态起始鼠标位置Y*/
    int MousePosY;  /*鼠标拖动状态鼠标位置Y*/
    float CurrentWllm(); /*当前测试条件下损耗系数*/
    void SetDlgMax(); /*设置绘图窗口为最大尺寸*/
    void SetDlgMin(); /*设置绘图窗口为最小尺寸*/
    void FileCableInfo();  /*根据文件头内容重置光缆信息*/
    void ChangeLan();   /*更换语言*/
    void InitCursor();   /*初始化光标*/
    int RunModule;  /*当前设备可用模块 1:OTDR 2:OPM 4:OPS 8:VFL 16:Camera 32:WIFI 64:Bluetooth 128:IOT*/
    void WriteOtdrDatFile();
    void ReadOtdrDatFile();
    quint32 FileTime;   /*文件中保存的时间值*/
    bool AutoSaveFile(short style);  /*自动保存文件 style:文件类型 0:EI 1:SOR*/
    int DebugOrModify;
    void WritePreCfgFile();
    void ReadPreCfgFile();

    #pragma pack(push)
    #pragma pack(1)
    struct   DATAEIHEAD         //ei文件数据头
    {
        unsigned short   D_Vmode;     //当前曲线的波长代码
        short   D_Vrle;      //量程代码
        short   D_Vatt;      //衰减代码
        short   D_Vpw;       //脉宽值
        qint32    D_Vzs1310;     //1310群折射率*100000
        qint32    D_Vzs1550;     //1550群折射率*100000
        qint32    D_Vzs1625;     //1650或1625群折射率*100000
        qint32    D_Vzs1490;     //1490群折射率*100000
        qint32    D_Vzs1383;     //1383群折射率*100000
        qint32    D_Vzs1300;     //1300群折射率*100000
        qint32    D_Vzs850;     //850群折射率*100000
        qint32    D_Vgxue;     //光缆修正系数*100000
        unsigned short  D_V2n;      //实际测试时的平均次数
        unsigned short  D_Avg;     //平均测试模式下设置的平均次数
        unsigned short  D_AvgA;    //自动测试模式下设置的平均次数
        unsigned short  D_Wllm1310;     //1310损耗修正因子*100
        unsigned short  D_Wllm1550;     //1550损耗修正因子*100
        unsigned short  D_Wllm1490;     //1490损耗修正因子 *100
        unsigned short  D_Wllm850;     //850损耗修正因子 *100
        unsigned short  D_Vmodule;   //模块代码
        quint32  D_markA;     //光标A在数据组中的位置
        quint32  D_markB;     //光标B在数据组中的位置
        quint32  D_Orig;     //参考原点在数据组中的位置
        short   D_item;      //测试项目代码
        short   D_TestMode;    //测试模式代码
        short   D_arith;     //测试算法代码
        unsigned short   D_SpAna;    //连接损耗分析事件门限*1000
        unsigned short   D_SpThre;    //连接损耗通过事件门限*1000
        unsigned short   D_RefThre;   //反射损耗通过事件门限*1000
        unsigned short   D_EndThre;   //光纤终点通过事件门限*1000
        quint32  D_DTS;  //测试时间
        short   D_Language;  //语言
        qint32    D_Light;     //检测接入带信号光纤的次数
        qint32    D_Flage;     //软件标示符
        qint32    D_Sn;        //本机串号，即机号
        qint32    D_PWM0;      //LCD屏亮度值
        unsigned short  D_StartMode;   //开机启动的模块，0表示开机进入OTDR模块，1表示开机进入功率计模块。
        unsigned short  D_HighResolution;  //是否是高分辨率测试
        unsigned short D_AutoAna;     //是否在取样后自动分析，0表示不自动分析，1表示取样后自动分析。
        unsigned short D_Lock;       //是否锁定了A、B光标，0表示没有锁定，1表示锁定了A、B光标。
        unsigned short D_Unit;       //长度单位，0表示km,1表示ft,2表示mi。
        unsigned short D_WholeT;     //表示是否处于全程轨迹测试模式，0表示不处于，1表示处于
        unsigned short D_OpmRef;     //光功率值参考值，默认为0dBm
        unsigned short D_OpmZero;    //光功率零点值
        unsigned short D_OpmRan;     //功率计量程代码
        unsigned short D_OpmWave;    //功率计波长代码
        unsigned short D_OpmAvg;     //功率计平均次数
        unsigned short D_WaveSet;    //仪器设置的波长测试代码。(由此代码可知仪器是否是多波长测试，以及设置了那几个波长测试)
        qint32    D_AutoMode;       //自动模式代码
        qint32    D_GaShow; //光眼图分析代码
        qint32    D_AvgTR;      //实际测试时的平均时间
        qint32    D_AvgT;     //平均测试模式下设置的平均时间
        qint32    D_AutoSave;
        qint32    D_Ghost;  //幻峰分析模式代码
        qint32    D_m7;
        qint32    D_m8;
        qint32    D_m9;
        qint32    D_m10;
    }FDatah[4],PreFDatah;
    struct FDatamap
    {
        char    map[4];            //Map\0
        unsigned short maprev;    //版本号200
        qint32   maplen;   //数据头单元总长度（86个字节）
        unsigned short mapnum;    //数据头文件包含的数据块的个数（6）
        char    gen[10];           //GenParams\0
        unsigned short genrev;   //版本号200
        qint32   genlen;           //一般参数单元的长度
        char   sup[10];          //SupParams\0
        unsigned short suprev;   //版本号200
        qint32   suplen;           //厂家信息单元的长度(68个字节）
        char   fix[10];          //FxdParams\0
        unsigned short fixrev;   //版本号200
        qint32   fixlen;           //固定参数单元长度（92个字节）
        char   datas[8];         //DataPts\0
        unsigned short datarev;  //版本号200
        qint32   datalen;          //数据点单元的长度
        char   crc[6];           //CKsum\0
        unsigned short crcrev;   //版本号200
        qint32   crclen;           //校验和单元的长度（8个字节）
    }FDmap[4],PreFDmap;

    struct FileFxdParams   //sor文件要读取的数据
    {
       char   FPID[10];     //FxdParams\0
       quint32  DTS;  //日期时间
       char   UD[2];        //距离单位
       unsigned short AW;   //实际波长
       qint32   AO;           //采样偏置（以100ps为单位表示）
       qint32   AOD;          //采样偏置（以距离表示，单位由UD决定）
       unsigned short TPW;  //用到的脉冲宽度的总数
       unsigned short PWU;  //脉冲宽度
       qint32   DS;           //数据间隔
       qint32   NPPW;         //相对于每个脉宽的数据点总数
       qint32   GI;           //群折射率
       unsigned short BC;  //反射系数，默认为800,即80.00dB
       qint32   NAV;         //平均次数
       unsigned short AT;  //平均时间，以平均时间*10（秒）表示
       qint32   AR;          //量程，以100ps为单位表示
       qint32   ARD;         //量程，以距离表示
       qint32   FPO;         //前面板偏置
       unsigned short NF;  //噪声电平，默认为55000,即-55.000dB
       unsigned short NFSF;  //噪声电平比例因子，默认为1000，即1.000
       unsigned short PO;    //附加的损耗，默认为0
       unsigned short LT;    //损耗阈值，默认为200，即0.200dB
       unsigned short RT;    //反射阈值，默认为40000,即-40.000dB
       unsigned short ET;    //光纤断点阈值，默认为3000,即3.000dB
       char   TT[2];        //曲线类型，默认为ST,表示标准
       qint32   WC1;          //默认为0
       qint32   WC2;          //默认为0
       qint32   WC3;          //默认为0
       qint32   WC4;          //默认为0
    }FDxdp[4],PreFDxdp;

    struct GenParams
    {
       char     PBID[10];    //GenParams\0
       char     LC[2];          //语言代码
       char     CID[20];         //光缆标识符
       char     FID[20];         //光纤标识符
       unsigned short FT;    //光纤类型，默认为652
       unsigned short NW;    //标称波长
       char     OL[20];          //起点位置
       char     TL[20];          //终点位置
       char     CCD[20];         //光缆代码
       char     CDF[2];         //当前数据标志
       qint32     UO;          //用户偏置（以100ps为单位表示）
       qint32     UOD;         //用户偏置（以距离表示）
       char     OP[20];          //操作者
       char     CMT[20];         //评论
    }FGenp[4],PreFGenp;

    struct SupParams
    {
       char   SPID[10];  //SupParams\0
       char   SN[17];    //供应商名称 The 41st of CETC\0
       char   MFID[8];   //主机标示符AV6418 \0
       char   OTDR[9];   //主机串号 0901001 \0
       char   OMID[5];   //插件标示符 3537\0
       char   OMSN[9];   //插件串号 0901001 \0
       char   SR[8];     //软件版本 ver1.00\0
       char   OT[2];     //其它 \0
    }FSupPa[4],PreFSupPa;

    struct DataPoint
    {
       char  DPID[8];        //DataPts\0
       qint32  TNDP;           //数据点总数
       unsigned short TSF;   //比例因子的总数
       qint32  TPS1;           //用于比例因子1的数据点总数
       unsigned short SF1;   //比例因子1
    }FDataP[4],PreFDataP;

    struct CheckSum
    {
       char CBID[6];          //CKsum\0
       unsigned short CSM;
    }FCheckS[4];
    #pragma pack()

protected:
    void paintEvent(QPaintEvent *event);
    void mouseReleaseEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
    bool eventFilter(QObject *obj, QEvent *event);

signals:
    void SendProgUpdate(int);
    void SendShowResult();
    void SendCursorChange();
    void SendDebug();
    void SendModify();

private slots:
    void on_ChangeColorButton_clicked();

    void on_XZoomOutButton_clicked();

    void on_XZoomInButton_clicked();

    void on_YZoomOutButton_clicked();

    void on_YZoomInButton_clicked();

    void on_ListButton_clicked();

    void RecInitTrace();

private:
    Ui::OtdrDialog *ui;  
    QPixmap DrawPix;
    QPixmap TempPix;
    int BackWidth;  /*绘图背景宽度*/
    int BackHeight;  /*绘图背景高度*/
    int DrawWidth;  /*曲线绘制宽度,应为网格数的整数倍,实际对应点数需加1*/
    int DrawHeight;  /*曲线绘制高度*/
    int DrawXOrig;  /*横轴偏移量*/
    int DrawYOrig;   /*纵轴偏移量*/
    int GridNum;   /*网格数*/
};

#endif // OtdrDialog_H
